iT邦幫忙

2021 iThome 鐵人賽

DAY 7
1

除了使用 DSL 的方式和資料庫進行互動之外,我們還可以透過更加物件導向的方式,來和資料庫進行溝通。

以下我們介紹使用 DAO 的方式,來和資料庫進行溝通。

什麼是 DAO

DAO(Data Access Object),類似於其他資料庫框架所說的 ORM(Object Relational Mapping),是用物件導向的方式,來和資料庫進行互動。

由於 DAO 使用的方式,是多數開發者已經很熟悉的物件操作。和需要思考背後 SQL 語法的 DSL 或者 Query Builder 比較,如果開發者對 Query 語法沒有這麼熟悉的話,使用 DAO 進行資料庫存取,會更加的直觀一些。

下面我們來介紹怎麼使用 DAO 來進行資料庫的 CRUD 操作。

建立 DAO 類別

首先,除了建立資料表以外,我們也要建立和表互動的類別。

我們在下面定義 User 類別,來做為我們存取 Users 資料表的 DAO

class User(id: EntityID<Int>) : IntEntity(id) {  
    companion object : IntEntityClass<User>(Users)  
    var cityId by Users.cityId  
 	var name by Users.name  
}

新增和讀取

建立好 DAO 類別之後,我們就可以透過物件的方式來存取資料庫。

比方說,我們可以建立新資料

transaction {  
 	SchemaUtils.create(Users)  
    User.new {  
		cityId = 1
 		name = "Alice"  
 	}  
 	User.new {  
		cityId = 2
 		name = "Bob"  
	} 
}

和 DSL 時一樣,我們建立好資料之後,如果沒有讀取的話,無法知道我們的資料是不是成功建立了。

我們一樣可以透過 DAO 物件來讀取資料

User  
    .all()  
    .forEach {  
        println("name: ${it.name}")  
    }

運行程式之後,我們就可以看到

name: Alice
name: Bob

修改

修改資料的方式也一樣可以透過 DAO 的做法,以物件的方式,我們只要修改 DAO 物件的 attribute,就可以修改資料

SchemaUtils.create(Users)  
User.new {  
	cityId = 1  
	name = "Alice"  
}  
val user = User.new {  
	cityId = 2  
	name = "Bob"  
}  
user.name = "Carol"  
User  
    .all()  
    .forEach{  
		println("name: ${it.name}")  
    }

這樣可以看到資料是

name: Alice
name: Carol

如果我們沒有儲存寫入資料一開始的 DAO 物件,我們可以透過 id 取出我們想要的資料

SchemaUtils.create(Users)  
User.new {
 	cityId = 1  
 	name = "Alice"  
}  
User.new {  
 	cityId = 2  
 	name = "Bob"  
}  
val user = User[1]  
user.name = "Carol"  
User  
    .all()  
    .forEach{  
 		println("name: ${it.name}")  
    }

這樣輸出就變成了

name: Carol
name: Bob

刪除

刪除的方式可以透過 delete() 函數進行操作。

SchemaUtils.create(Users)  
User.new {
 	cityId = 1  
 	name = "Alice"  
}  
User.new {  
 	cityId = 2  
 	name = "Bob"  
}  
User[1].delete()
User  
    .all()  
    .forEach{  
 		println("name: ${it.name}")  
    }

運作這段程式之後,我們就會看到 Alice 的資料消失了

name: Bob

介紹完 DAO 的 CRUD 之後,我們來介紹一下上面程式內用到的 kotlin 語法。

什麼是 companion object

根據 kotlin 官方文件的 companion object 說明

An object declaration inside a class can be marked with the companion keyword

DAO 的做法裏面,透過宣告

companion object : IntEntityClass<User>(Users)

我們可以讓 User 類別能存取 IntEntityClass 內的函數,進而執行 EntityClass 所定義的 new()all()delete() 等函數。

以上我們簡單的介紹了 kotlin Exposed 透過 DAO 執行 CRUD 的做法,我們下回見!


上一篇
[Day 06] DSL 其他和資料庫互動的方式
下一篇
[Day 08] Kotlin DAO 其他和資料庫互動的方式
系列文
Kotlin 怎麼操作資料庫?談談 Kotlin Exposed 框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言